package cc.csln.so.cdelayqueue;

import lombok.Getter;
import lombok.Setter;

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer;

/**
 * 队列元素，表示一次延迟任务。
 *
 * @author Cusalt
 * @since 2025/10/17 15:13
 **/
@Getter
@Setter
public class DelayedTask implements Delayed {
    /**
     * 任务唯一标识，用于去重与回调传参。
     */
    private final String key;
    /**
     * 任务负载，自定义内容，透传给回调。
     */
    private String payload;
    /**
     * 触发时间戳（毫秒），用于计算剩余延迟。
     */
    private long triggerTime;
    /**
     * 任务触发时的回调处理。
     */
    private BiConsumer<String, String> callback;

    public DelayedTask(String key, String payload, long triggerTime, BiConsumer<String, String> callback) {
        this.key = key;
        this.payload = payload;
        this.triggerTime = triggerTime;
        this.callback = callback;
    }

    /**
     * 返回相对于当前时间的剩余延迟。
     */
    @Override
    public long getDelay(TimeUnit unit) {
        return unit.convert(triggerTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
    }

    /**
     * 按触发时间排序，时间越早优先级越高。
     */
    @Override
    public int compareTo(Delayed o) {
        return Long.compare(triggerTime, ((DelayedTask) o).triggerTime);
    }
}
